package com.taotao.service.impl;

import com.taotao.CookieUtils;
import com.taotao.HttpUtil;
import com.taotao.JsonUtils;
import com.taotao.TaotaoResult;
import com.taotao.ext.TbItemExt;
import com.taotao.pojo.TbItem;
import com.taotao.service.CartService;
import com.taotao.service.TbItemService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;

@Service
public class CartServiceImpl implements CartService {

    //COOKIE中购物车商品对应的key
    @Value("${CART_ITEMS_LIST_KEY}")
    private String CART_ITEMS_LIST_KEY;
    //购物车cookie生存期
    @Value("${CART_ITEMS_EXPIRE_TIME}")
    private Integer CART_ITEMS_EXPIRE_TIME;

    /**
     * 添加商品到购物车中
     *
     * 1. 根据商品ID查询出商品详细信息用于购物车中展示(提到CartController层中做)
     * 2. 根据商品ID去cookie中查询是否已存在该商品
     *      2.1. 如果不存在，直接将该商品添加到cookie中，数量为1
     *      2.2. 如果已存在，那么将该商品的数量+1，总价相应调整
     * 3. 将修改后的购物车数据写入到cookie中，同时将数据存储到作用域中一份，用于前端页面展示
     *
     * @param tbItem 商品详细信息
     * @param request
     * @param response
     * @return
     */
    @Override
    public TaotaoResult addItem(TbItemExt tbItem, HttpServletRequest request, HttpServletResponse response) {

        //取cookie中购物车商品列表
        List<TbItemExt> cartItems = getItemListFromCookie(request);
        //判断该商品是否存在于购物车中
        boolean itemExists = false;
        for (TbItemExt i : cartItems) {
            if (i.getId().equals(tbItem.getId())) {
                //购物车中有此商品
                i.setNum(i.getNum() + 1);
                itemExists = true;
                break;
            }

        }
        //如果商品不存在于购物车则向购物车商品列表中添加一个商品
        if (! itemExists) {
            //设置数量为1
            tbItem.setNum(1);
            //把商品添加到购物车
            cartItems.add(tbItem);
        }
        //把购物车信息写入cookie中
        CookieUtils.setCookie(request, response, CART_ITEMS_LIST_KEY, JsonUtils.objectToJson(cartItems), CART_ITEMS_EXPIRE_TIME, true);

        return TaotaoResult.ok(cartItems);

    }

    @Override
    public TaotaoResult showCart(HttpServletRequest req) {
        List<TbItemExt> tbItems = getItemListFromCookie(req);
        return TaotaoResult.ok(tbItems);
    }

    private List<TbItemExt> getItemListFromCookie(HttpServletRequest request) {
        //取cookie中购物车商品列表
        String cartItemsStr = CookieUtils.getCookieValue(request, CART_ITEMS_LIST_KEY, true);
        //如果不为空那么就转换成java对象
        List<TbItemExt> cartItems = null;
        if (!StringUtils.isBlank(cartItemsStr)) {
            cartItems = JsonUtils.jsonToList(cartItemsStr, TbItemExt.class);
        } else {
            cartItems = new ArrayList<>();
        }
        return cartItems;
    }

}
